package cc.rengu.redp.common.uid.service;

import cc.rengu.redp.common.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;


/**
 * 业务流水号生成器
 *
 * @author xushitang
 */
@Slf4j
public class BizUidGenerator {

    private static Map<String, BizUidService> bizMap = new HashMap<>();

    private BizUidGenerator() {}

    /**
     * 生成指定类型序列
     * @param bizUidClass
     * @return
     */
    public static <T extends BizUidService> String getBizUid(Class<T> bizUidClass) {
        TbPubSeqService tbPubSeqService = SpringContextUtil.getBean(TbPubSeqServiceImpl.class);
        return tbPubSeqService.getBizUidGo(loadClass(bizUidClass), bizUidClass.getName());
    }

    /**
     * 加载Class
     * @param bizUidClass
     * @param <T>
     * @return
     */
    private static <T extends BizUidService> BizUidService loadClass(Class<T> bizUidClass) {
        BizUidService bizUidService = bizMap.get(bizUidClass.getName());
        if (bizUidService == null) {
            synchronized (bizUidClass) {
                if (bizMap.get(bizUidClass.getName()) == null) {
                    try {
                        bizUidService = bizUidClass.newInstance();
                    } catch (InstantiationException e) {
                        log.error("BizUidGenerator init " + bizUidClass.getName() + " error", e);
                        return null;
                    } catch (IllegalAccessException e) {
                        log.error("BizUidGenerator init " + bizUidClass.getName() + " error", e);
                        return null;
                    }
                    bizMap.put(bizUidClass.getName(), bizUidService);
                } else {
                    return bizMap.get(bizUidClass.getName());
                }
            }
        }

        return bizUidService;
    }
}
